package cn.edu.flying_birds;

import cn.edu.flying_birds.utils.Tools;

import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @PackageName: cn.edu.flying_birds
 * @ClassName: Bird
 * @Description:
 * @author: RZS
 * @date: 2021/6/8  23:41
 */
public class Bird {
    // 小鸟图片对象
    BufferedImage img;
    // 小鸟出现的X, Y坐标
    int x;
    int y;
    // 小鸟图片的宽高
    int width;
    int height;
    // 小鸟图片组
    BufferedImage[] imgs = new BufferedImage[8];
    // 定义小鸟向上飞的初速度
    double v0;
    // 每次向上飞的时间
    double t;
    // 每次向上飞的距离
    double s;
    // 重力加速度
    double g;

    public Bird() throws IOException {
        // 初始化小鸟属性
        img = Tools.getImg("../../img/0.png");
        x = 142;
        y = 276;
        width = img.getWidth() / 2;
        height = img.getHeight() / 2;
        // 初始化小鸟图片组
        for (int i = 0; i < imgs.length; i++) {
            imgs[i] = Tools.getImg("../../img/"+i+".png");
        }
        // 初始化小鸟向上飞的初速度
        v0 = 3;
        // 初始化向上飞的时间
        t = 0.2;
        // 初始化向上飞的距离
        s = 2;
        // 初始化加速度
        g = 9;
    }

    /**
     * 小鸟飞
     */
    int index = 0;
    public void flying(){
        if(index >= imgs.length - 1){
            index = 0;
        }else{
            img = imgs[index];
            index++;
        }

    }

    /**
     * 小鸟下落
     */
    public void moveDown(){
        // 计算小鸟上抛时的距离
        s = v0 * t;
        // 计算小鸟上抛时的最高点Y坐标
        y = (int)(y - s);
        // 计算小鸟到达最高点的速度
        double v2 = v0 - g * t;
        // 此时最高点的速度就是小鸟下落的初速度
        v0 = v2;
    }

    /**
     * 小鸟往上飞
     */
    public void moveUp(){
        v0 = 20;
    }

    /**
     * 判断小鸟是否与地面相撞
     * @return
     */
    public boolean strike() {
        try {
            if(y <= 644 -height - new Ground().height){
                // 小鸟没有与地面相撞
                return false;
            }else{
                // 小鸟与地面相撞
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 默认没有与地面相撞
        return false;
    }

    /**
     * 判断小鸟与柱子是否相撞
     * @return
     */
    public boolean strike(Column column) {
        // 判断小鸟与柱子是否相撞
        boolean bool1 = x < column.x - width;//判断小鸟是否与柱子左侧相撞
        boolean bool2 = x >= column.width + column.x;//判断小鸟是否与柱子右侧相撞
        // 判断小鸟是否与柱子空隙处相撞
        boolean bool3 = y > column.height/2 - column.gap/2 + column.y;//判断小鸟是否与上柱子相撞
        boolean bool4 = y + height < column.height/2 - column.gap/2 + column.y + column.gap;//判断小鸟是否与下柱子相撞
        if(bool1 || bool2 || (bool3 && bool4)){
            // 没有相撞
            return false;
        }
        // 撞到了
        return true;
    }
}
